【SFA官方翻译】在Java中应用微服务开发RESTful APIs
原文链接:https://dzone.com/articles/developing-restful-apis-in-java-using-amazon-api-g
作者:Muhammad Ali
译者:Dom
本文旨在进一步学习如何利用Amazon API Gateway和AWS Lambda开发RESTful风格的Java API.
简介
AWS Lambda和Amazon API Gateway可用于实现基于Java语言的RESTful风格的web服务, 而且开发者不必考虑复杂的Java框架的配置, 或是搭建, 维护web服务器(如Tomcat, WebSphere, 等). 结合使用Lambda和API Gateway可使开发者非常轻松的开发API, 维护不同的开发环境, 比如开发(Dev), 测试(Test)和生产(Prod)环境等.
AWS Lambda是一种具备高扩展性, 高可用性的去服务器化的计算平台(serverless compute platform). 你可以在这种平台上运行你的Java代码来为你的服务提供主要功能. 请访问链接以了解更多关于Lambda的信息.
Amazon API Gateway是AWS众多网络服务中的一员. 它允许开发者轻松构建和部署API终端(endpoint). 它使开发者可以异常轻松得创建HTTPS终端并且集成Lambda函数(function). 数据交由API Gateway处理, 从API终端传输到Lambda函数. 请访问链接以了解更多关于API Gateway的信息.
本文将分步骤指导开发者如何使用Lambda和API Gateway开发Java RESTful风格微服务.
准备工作
首先, 你需要有一个可用的, 装有Java 8, Eclipse IDE和Eclipse AWS 工具集(Toolkit)的开发环境.
步骤1: 创建Lambda函数
一旦你有了可用的Eclipse IDE, 一个AWS图标将出现在主工具栏(main toolbar). 点击该图标并选择"新的AWS Lambda项目..."
配置合适的项目名和其他Maven配置. 选择"流式请求处理器"(Stream Request Handler)作为输入类型(Input type).
点击"完成"(Finish)后, 样例代码会自动生成到你新建的项目中. 打开主处理函数(main handler function)并更新如下代码段.
package com.amazonaws.lambda.demo;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.Writer;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
public class LambdaFunctionHandler implements RequestStreamHandler
{
JSONParser parser = new JSONParser();
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException
{
LambdaLogger logger = context.getLogger();
logger.log("Loading Java Lambda handler of ProxyWithStream");
String proxy = null;
String param1 = null;
String param2 = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
JSONObject responseJson = new JSONObject();
String responseCode = "200";
JSONObject event = null;
try {
event = (JSONObject)parser.parse(reader);
if (event.get("pathParameters") != null) {
JSONObject pps = (JSONObject)event.get("pathParameters");
if ( pps.get("proxy") != null) {
proxy = (String)pps.get("proxy");
}
}
if (event.get("queryStringParameters") != null)
{
JSONObject qps = (JSONObject)event.get("queryStringParameters");
if ( qps.get("param1") != null)
{
param1 = (String)qps.get("param1");
}
}
if (event.get("queryStringParameters") != null)
{
JSONObject qps = (JSONObject)event.get("queryStringParameters");
if ( qps.get("param2") != null)
{
param2 = (String)qps.get("param2");
}
}
}
catch(Exception pex)
{
responseJson.put("statusCode", "400");
responseJson.put("exception", pex);
}
// Implement your logic here
int output = 0;
if (proxy.equals("sum"))
{
output = sum(Integer.parseInt(param1), Integer.parseInt(param2));
}
else if (proxy.equals("subtract"))
{
output = subtract(Integer.parseInt(param1), Integer.parseInt(param2));
}
JSONObject responseBody = new JSONObject();
responseBody.put("input", event.toJSONString());
responseBody.put("message", "Output is" + output);
JSONObject headerJson = new JSONObject();
headerJson.put("x-custom-header", "my custom header value");
headerJson.put("Access-Control-Allow-Origin", "*");
responseJson.put("isBase64Encoded", false);
responseJson.put("statusCode", responseCode);
responseJson.put("headers", headerJson);
responseJson.put("body", responseBody.toString());
OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8");
writer.write(responseJson.toJSONString());
writer.close();
}
public int sum(int a, int b)
{
return a+b;
}
public int subtract(int a, int b)
{
return a-b;
}
}
构建并部署该Lambda函数. 完整的部署信息可以参考链接.
本例中我们以"RESTAPIHelloWorld"命名, 在AWS 控制台(console)中成功创建了Lambda函数.
步骤2: 创建API Gateway终端
到AWS 控制台中启动API Gateway服务.
点击"创建API"(Create API).
选择"新API"(New API)并命名之.
在创建了新的API后, 添加新的资源(Resource), 如下图:
请确保你选择了"配置为代理资源"(Configure as proxy resource)选项.
如下图中显示的 - "任意"(ANY)方法的设置, 选择"Lambda函数"作为集成类型(integration type). 同样的, 确保你选择了"使用Lambda代理集成"(Use Lambda Proxy integration)选项. 选择你想要部署Lambda函数的地理区域, 输入Lambda函数的名称.
现在我们将部署该API到特定环境中. 点击"操作"(Actions)下拉菜单并选择"部署API"(Deploy API).
选择"新环境"(New Stage)并输入环境名和简介. 在该教程中, 我们使用"开发"(Dev)作为环境名. 一旦部署完成, AWS 控制台将自动跳转到环境页面.
拷贝"调用URL"(Invoke URL)并将代理资源名和你想要传给你的Lambda函数的参数附在后面. 对于该教程, 可参考如下例子:
格式: https://5yv20hbz44.execute-api.eu-west-1.amazonaws.com/Dev/{proxy}?{setofparamsseparatedby_&}
例如: https://5yv20hbz44.execute-api.eu-west-1.amazonaws.com/Dev/sum?param1=100¶m2=100
输出如下:
小结
像AWS Lambda这样的去服务器化计算平台现今已非常流行. 许多组织都要求他们的自动化开发运维工程师(DevOps)具备开发去服务器化应用的能力. 如此即可降低安装硬件/软件设施的耗时, 也便缩减了项目交付的周期. 跟随本简单教程, 你应该可以使用Java上手开发去服务器化的AWS微服务了.
招人:数心,造化心数奇;用心等你...
上一篇:【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
点击阅读原文查看更多